/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package Control;

import Control.exceptions.NonexistentEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import Entidades.PosicionFrenteIva;
import Entidades.Direccion;
import Entidades.TipoDocumento;
import Entidades.Nacionalidad;
import Entidades.Ocupacion;
import Entidades.Estadia;
import java.util.ArrayList;
import java.util.List;
import Entidades.Factura;
import Entidades.Pasajero;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author USUARIO
 */
public class PasajeroJpaController implements Serializable {

    public PasajeroJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Pasajero pasajero) {
        if (pasajero.getEstadiaList() == null) {
            pasajero.setEstadiaList(new ArrayList<Estadia>());
        }
        if (pasajero.getFacturaList() == null) {
            pasajero.setFacturaList(new ArrayList<Factura>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            PosicionFrenteIva posicionIva = pasajero.getPosicionIva();
            if (posicionIva != null) {
                posicionIva = em.getReference(posicionIva.getClass(), posicionIva.getIdPosIva());
                pasajero.setPosicionIva(posicionIva);
            }
            Direccion direccion = pasajero.getDireccion();
            if (direccion != null) {
                direccion = em.getReference(direccion.getClass(), direccion.getIdDireccion());
                pasajero.setDireccion(direccion);
            }
            TipoDocumento tipoDoc = pasajero.getTipoDoc();
            if (tipoDoc != null) {
                tipoDoc = em.getReference(tipoDoc.getClass(), tipoDoc.getIdTipo());
                pasajero.setTipoDoc(tipoDoc);
            }
            Nacionalidad nacionalidad = pasajero.getNacionalidad();
            if (nacionalidad != null) {
                nacionalidad = em.getReference(nacionalidad.getClass(), nacionalidad.getIdNacionalidad());
                pasajero.setNacionalidad(nacionalidad);
            }
            Ocupacion ocupacion = pasajero.getOcupacion();
            if (ocupacion != null) {
                ocupacion = em.getReference(ocupacion.getClass(), ocupacion.getIdOcupacion());
                pasajero.setOcupacion(ocupacion);
            }
            List<Estadia> attachedEstadiaList = new ArrayList<Estadia>();
            for (Estadia estadiaListEstadiaToAttach : pasajero.getEstadiaList()) {
                estadiaListEstadiaToAttach = em.getReference(estadiaListEstadiaToAttach.getClass(), estadiaListEstadiaToAttach.getIdEstadia());
                attachedEstadiaList.add(estadiaListEstadiaToAttach);
            }
            pasajero.setEstadiaList(attachedEstadiaList);
            List<Factura> attachedFacturaList = new ArrayList<Factura>();
            for (Factura facturaListFacturaToAttach : pasajero.getFacturaList()) {
                facturaListFacturaToAttach = em.getReference(facturaListFacturaToAttach.getClass(), facturaListFacturaToAttach.getNroFactura());
                attachedFacturaList.add(facturaListFacturaToAttach);
            }
            pasajero.setFacturaList(attachedFacturaList);
            em.persist(pasajero);
            if (posicionIva != null) {
                posicionIva.getPasajeroList().add(pasajero);
                posicionIva = em.merge(posicionIva);
            }
            if (direccion != null) {
                direccion.getPasajeroList().add(pasajero);
                direccion = em.merge(direccion);
            }
            if (tipoDoc != null) {
                tipoDoc.getPasajeroList().add(pasajero);
                tipoDoc = em.merge(tipoDoc);
            }
            if (nacionalidad != null) {
                nacionalidad.getPasajeroList().add(pasajero);
                nacionalidad = em.merge(nacionalidad);
            }
            if (ocupacion != null) {
                ocupacion.getPasajeroList().add(pasajero);
                ocupacion = em.merge(ocupacion);
            }
            for (Estadia estadiaListEstadia : pasajero.getEstadiaList()) {
                estadiaListEstadia.getPasajeroList().add(pasajero);
                estadiaListEstadia = em.merge(estadiaListEstadia);
            }
            for (Factura facturaListFactura : pasajero.getFacturaList()) {
                Pasajero oldIdPasajeroOfFacturaListFactura = facturaListFactura.getIdPasajero();
                facturaListFactura.setIdPasajero(pasajero);
                facturaListFactura = em.merge(facturaListFactura);
                if (oldIdPasajeroOfFacturaListFactura != null) {
                    oldIdPasajeroOfFacturaListFactura.getFacturaList().remove(facturaListFactura);
                    oldIdPasajeroOfFacturaListFactura = em.merge(oldIdPasajeroOfFacturaListFactura);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Pasajero pasajero) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Pasajero persistentPasajero = em.find(Pasajero.class, pasajero.getIdPasajero());
            PosicionFrenteIva posicionIvaOld = persistentPasajero.getPosicionIva();
            PosicionFrenteIva posicionIvaNew = pasajero.getPosicionIva();
            Direccion direccionOld = persistentPasajero.getDireccion();
            Direccion direccionNew = pasajero.getDireccion();
            TipoDocumento tipoDocOld = persistentPasajero.getTipoDoc();
            TipoDocumento tipoDocNew = pasajero.getTipoDoc();
            Nacionalidad nacionalidadOld = persistentPasajero.getNacionalidad();
            Nacionalidad nacionalidadNew = pasajero.getNacionalidad();
            Ocupacion ocupacionOld = persistentPasajero.getOcupacion();
            Ocupacion ocupacionNew = pasajero.getOcupacion();
            List<Estadia> estadiaListOld = persistentPasajero.getEstadiaList();
            List<Estadia> estadiaListNew = pasajero.getEstadiaList();
            List<Factura> facturaListOld = persistentPasajero.getFacturaList();
            List<Factura> facturaListNew = pasajero.getFacturaList();
            if (posicionIvaNew != null) {
                posicionIvaNew = em.getReference(posicionIvaNew.getClass(), posicionIvaNew.getIdPosIva());
                pasajero.setPosicionIva(posicionIvaNew);
            }
            if (direccionNew != null) {
                direccionNew = em.getReference(direccionNew.getClass(), direccionNew.getIdDireccion());
                pasajero.setDireccion(direccionNew);
            }
            if (tipoDocNew != null) {
                tipoDocNew = em.getReference(tipoDocNew.getClass(), tipoDocNew.getIdTipo());
                pasajero.setTipoDoc(tipoDocNew);
            }
            if (nacionalidadNew != null) {
                nacionalidadNew = em.getReference(nacionalidadNew.getClass(), nacionalidadNew.getIdNacionalidad());
                pasajero.setNacionalidad(nacionalidadNew);
            }
            if (ocupacionNew != null) {
                ocupacionNew = em.getReference(ocupacionNew.getClass(), ocupacionNew.getIdOcupacion());
                pasajero.setOcupacion(ocupacionNew);
            }
            List<Estadia> attachedEstadiaListNew = new ArrayList<Estadia>();
            for (Estadia estadiaListNewEstadiaToAttach : estadiaListNew) {
                estadiaListNewEstadiaToAttach = em.getReference(estadiaListNewEstadiaToAttach.getClass(), estadiaListNewEstadiaToAttach.getIdEstadia());
                attachedEstadiaListNew.add(estadiaListNewEstadiaToAttach);
            }
            estadiaListNew = attachedEstadiaListNew;
            pasajero.setEstadiaList(estadiaListNew);
            List<Factura> attachedFacturaListNew = new ArrayList<Factura>();
            for (Factura facturaListNewFacturaToAttach : facturaListNew) {
                facturaListNewFacturaToAttach = em.getReference(facturaListNewFacturaToAttach.getClass(), facturaListNewFacturaToAttach.getNroFactura());
                attachedFacturaListNew.add(facturaListNewFacturaToAttach);
            }
            facturaListNew = attachedFacturaListNew;
            pasajero.setFacturaList(facturaListNew);
            pasajero = em.merge(pasajero);
            if (posicionIvaOld != null && !posicionIvaOld.equals(posicionIvaNew)) {
                posicionIvaOld.getPasajeroList().remove(pasajero);
                posicionIvaOld = em.merge(posicionIvaOld);
            }
            if (posicionIvaNew != null && !posicionIvaNew.equals(posicionIvaOld)) {
                posicionIvaNew.getPasajeroList().add(pasajero);
                posicionIvaNew = em.merge(posicionIvaNew);
            }
            if (direccionOld != null && !direccionOld.equals(direccionNew)) {
                direccionOld.getPasajeroList().remove(pasajero);
                direccionOld = em.merge(direccionOld);
            }
            if (direccionNew != null && !direccionNew.equals(direccionOld)) {
                direccionNew.getPasajeroList().add(pasajero);
                direccionNew = em.merge(direccionNew);
            }
            if (tipoDocOld != null && !tipoDocOld.equals(tipoDocNew)) {
                tipoDocOld.getPasajeroList().remove(pasajero);
                tipoDocOld = em.merge(tipoDocOld);
            }
            if (tipoDocNew != null && !tipoDocNew.equals(tipoDocOld)) {
                tipoDocNew.getPasajeroList().add(pasajero);
                tipoDocNew = em.merge(tipoDocNew);
            }
            if (nacionalidadOld != null && !nacionalidadOld.equals(nacionalidadNew)) {
                nacionalidadOld.getPasajeroList().remove(pasajero);
                nacionalidadOld = em.merge(nacionalidadOld);
            }
            if (nacionalidadNew != null && !nacionalidadNew.equals(nacionalidadOld)) {
                nacionalidadNew.getPasajeroList().add(pasajero);
                nacionalidadNew = em.merge(nacionalidadNew);
            }
            if (ocupacionOld != null && !ocupacionOld.equals(ocupacionNew)) {
                ocupacionOld.getPasajeroList().remove(pasajero);
                ocupacionOld = em.merge(ocupacionOld);
            }
            if (ocupacionNew != null && !ocupacionNew.equals(ocupacionOld)) {
                ocupacionNew.getPasajeroList().add(pasajero);
                ocupacionNew = em.merge(ocupacionNew);
            }
            for (Estadia estadiaListOldEstadia : estadiaListOld) {
                if (!estadiaListNew.contains(estadiaListOldEstadia)) {
                    estadiaListOldEstadia.getPasajeroList().remove(pasajero);
                    estadiaListOldEstadia = em.merge(estadiaListOldEstadia);
                }
            }
            for (Estadia estadiaListNewEstadia : estadiaListNew) {
                if (!estadiaListOld.contains(estadiaListNewEstadia)) {
                    estadiaListNewEstadia.getPasajeroList().add(pasajero);
                    estadiaListNewEstadia = em.merge(estadiaListNewEstadia);
                }
            }
            for (Factura facturaListOldFactura : facturaListOld) {
                if (!facturaListNew.contains(facturaListOldFactura)) {
                    facturaListOldFactura.setIdPasajero(null);
                    facturaListOldFactura = em.merge(facturaListOldFactura);
                }
            }
            for (Factura facturaListNewFactura : facturaListNew) {
                if (!facturaListOld.contains(facturaListNewFactura)) {
                    Pasajero oldIdPasajeroOfFacturaListNewFactura = facturaListNewFactura.getIdPasajero();
                    facturaListNewFactura.setIdPasajero(pasajero);
                    facturaListNewFactura = em.merge(facturaListNewFactura);
                    if (oldIdPasajeroOfFacturaListNewFactura != null && !oldIdPasajeroOfFacturaListNewFactura.equals(pasajero)) {
                        oldIdPasajeroOfFacturaListNewFactura.getFacturaList().remove(facturaListNewFactura);
                        oldIdPasajeroOfFacturaListNewFactura = em.merge(oldIdPasajeroOfFacturaListNewFactura);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = pasajero.getIdPasajero();
                if (findPasajero(id) == null) {
                    throw new NonexistentEntityException("The pasajero with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Pasajero pasajero;
            try {
                pasajero = em.getReference(Pasajero.class, id);
                pasajero.getIdPasajero();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The pasajero with id " + id + " no longer exists.", enfe);
            }
            PosicionFrenteIva posicionIva = pasajero.getPosicionIva();
            if (posicionIva != null) {
                posicionIva.getPasajeroList().remove(pasajero);
                posicionIva = em.merge(posicionIva);
            }
            Direccion direccion = pasajero.getDireccion();
            if (direccion != null) {
                direccion.getPasajeroList().remove(pasajero);
                direccion = em.merge(direccion);
            }
            TipoDocumento tipoDoc = pasajero.getTipoDoc();
            if (tipoDoc != null) {
                tipoDoc.getPasajeroList().remove(pasajero);
                tipoDoc = em.merge(tipoDoc);
            }
            Nacionalidad nacionalidad = pasajero.getNacionalidad();
            if (nacionalidad != null) {
                nacionalidad.getPasajeroList().remove(pasajero);
                nacionalidad = em.merge(nacionalidad);
            }
            Ocupacion ocupacion = pasajero.getOcupacion();
            if (ocupacion != null) {
                ocupacion.getPasajeroList().remove(pasajero);
                ocupacion = em.merge(ocupacion);
            }
            List<Estadia> estadiaList = pasajero.getEstadiaList();
            for (Estadia estadiaListEstadia : estadiaList) {
                estadiaListEstadia.getPasajeroList().remove(pasajero);
                estadiaListEstadia = em.merge(estadiaListEstadia);
            }
            List<Factura> facturaList = pasajero.getFacturaList();
            for (Factura facturaListFactura : facturaList) {
                facturaListFactura.setIdPasajero(null);
                facturaListFactura = em.merge(facturaListFactura);
            }
            em.remove(pasajero);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Pasajero> findPasajeroEntities() {
        return findPasajeroEntities(true, -1, -1);
    }

    public List<Pasajero> findPasajeroEntities(int maxResults, int firstResult) {
        return findPasajeroEntities(false, maxResults, firstResult);
    }

    private List<Pasajero> findPasajeroEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Pasajero.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Pasajero findPasajero(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Pasajero.class, id);
        } finally {
            em.close();
        }
    }

    public int getPasajeroCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Pasajero> rt = cq.from(Pasajero.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
